﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Tizer.Web.Helper
{
    /// <summary>
    /// Хелпер для разбора строки запроса
    /// </summary>
    /// <example>
    /// int startIndex = QueryHelper.Value<int>("startIndex", 0);
    /// string keywords = QS.Value<string>("keywords"); 
    /// </example>
    public class QueryHelper
    {
        /// <summary>
        /// Определение параметра на существование
        /// </summary>
        /// <param name="parameterName">Название параметра</param>
        /// <returns>true - если существует</returns>
        public static bool IsExsist (string parameterName)
        {
            if (HttpContext.Current == null)
                throw new InvalidOperationException("Не удается вызвать QueryHelper<T> при HttpContext.Current равным null");

            HttpRequest request = HttpContext.Current.Request;

            if (request.QueryString[parameterName] != null && !string.IsNullOrEmpty(request.QueryString[parameterName]))
                return false;

            return true;
        }

        /// <summary>
        /// Получить значение параметра
        /// </summary>
        /// <typeparam name="T">Тип</typeparam>
        /// <param name="parameterName">Параметр</param>
        /// <returns>Значение параметра</returns>
        public static T Value<T>(string parameterName) where T : IConvertible
        {
            if (HttpContext.Current == null)
                throw new InvalidOperationException("Не удается вызвать QueryHelper<T> при HttpContext.Current равным null");

            if (string.IsNullOrEmpty(HttpContext.Current.Request[parameterName]))
                throw new InvalidOperationException(string.Format("Ожидаемые параметр строки запроса с названием '{0}' уже существует", parameterName));

            return Value<T>(parameterName, default(T));
        }

        
        /// <summary>
        /// Получить значение параметра
        /// </summary>
        /// <typeparam name="T">Тип</typeparam>
        /// <param name="parameterName">Параметр</param>
        /// <param name="defaultValue">Значение по умолчанию если в параметре ошибка</param>
        /// <returns>Значение параметра</returns>
        public static T Value<T>(string parameterName, T defaultValue) where T : IConvertible
        {
            if (HttpContext.Current == null)
                throw new InvalidOperationException("Не удается вызвать QueryHelper<T> при HttpContext.Current равным null");

            HttpRequest request = HttpContext.Current.Request;

            string input;
            if (request.QueryString[parameterName] != null && !string.IsNullOrEmpty(request.QueryString[parameterName]))
                input = request.QueryString[parameterName];
            else
                return defaultValue;

            T value;
            try
            {
                value = (T)Convert.ChangeType(input, typeof(T));
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(string.Format("Не удалось преобразовать параметр строки запроса с названием '{0}' и значением '{1}' с типом {2}", parameterName, input, typeof(T).FullName), ex);
            }
            return value;
        }
    }  
}